package com.bjsxt.shop.back.springmvc.interceptor;

import java.net.URLEncoder;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.bjsxt.shop.common.util.ConstatFinalUtil;
import com.bjsxt.shop.common.util.DateFormatUtil;
import com.bjsxt.shop.common.util.HttpUtil;
import com.bjsxt.shop.users.pojo.AAdmins;
import com.bjsxt.shop.users.service.IUsersService;

/**
 * 拦截器
 * 
 * @author WangshSxt
 *
 */
@Component("authInterceptor")
public class AuthInterceptor extends HandlerInterceptorAdapter {
	@Resource
	private IUsersService usersService;

	@Resource
	private DateFormatUtil dateFormatUtil;

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		ConstatFinalUtil.SYS_LOGGER.info("==AuthInterceptor preHandle==");
		HttpSession session = request.getSession();

		/* 开发版本不需要启用用户中心 */
		if ("0".equalsIgnoreCase(ConstatFinalUtil.CONFIG_JSON.getString("version"))) {
			/* 开发服务器 */
			/* 查询一个管理员对象放到Session中 */
			Map<String, Object> condMap = new HashMap<String, Object>();
			condMap.put("id", "1");
			AAdmins admins = this.usersService.findOneAdminsService(condMap);
			session.setAttribute("admins", admins);
			return true;
		}

		/* 先检查session是否有值 */
		AAdmins adminsSess = (AAdmins) session.getAttribute("admins");
		if (adminsSess != null) {
			return true;
		}

		/*
		 * token 如果有多个token: 取最后一个
		 */
		String[] tokens = request.getParameterValues("token");
		String token = "";
		if (tokens != null) {
			token = tokens[tokens.length - 1];
		}

		/*
		 * 传入了token 就是从用户中心跳转过来的
		 */
		if (!"".equalsIgnoreCase(token)) {
			/*
			 * 到token的颁发中心,去验证一下是不是你颁发的 验证token的接口,我们今天上午写过了
			 */
			HttpUtil httpUtil = new HttpUtil();

			/*
			 * 拼装上行的json
			 */
			JSONObject requestJSON = new JSONObject();
			requestJSON.put("version", "1");

			JSONObject dataJSON = new JSONObject();
			dataJSON.put("token", token);

			requestJSON.put("data", dataJSON);

			/* 拼装url */
			/*
			 * String url =
			 * "http://localhost:8080/userscenter-back/outer/json/verfiyToken.htm?json={%22version%22:%221%22,%22data%22:{%22token%22:%2226174d6f-2cac-4a00-99ff-7d79df12f38a%22}}"
			 * ;
			 */
			String url = ConstatFinalUtil.CONFIG_JSON.getString("userscenter.back.verifyToken.url");
			String params = "?json=" + requestJSON.toJSONString();
			url += params;
			System.out.println("-----url----------" + url);
			String result = httpUtil.methodGet(url);
			System.out.println(result + "==============");
			/*
			 * 处理返回值 解析成json
			 */
			JSONObject resultJSON = (JSONObject) JSON.parse(result);
			/*
			 * code:0成功
			 */
			if (resultJSON != null && "0".equalsIgnoreCase(resultJSON.getString("code"))) {
				JSONObject dataResJSON = (JSONObject) resultJSON.get("data");
				JSONObject adminsJSON = dataResJSON.getJSONObject("admins");
				/*
				 * 将token的相关信息存储到客户端的session中 将商城自己的管理员对象存储到session中
				 */
				/*
				 * 拿着token对应的adminsJSON它是在用户中心中的数据 拿着用户中心管理员的id(商城数据库里面的ssoId)
				 * 
				 * 查询一下商城的数据库里面有木有管理员. 如果有,更新, 如果木有,添加
				 */
				String ssoId = adminsJSON.get("id") + "";
				/*
				 * 拿着用户中心管理员的id(商城数据库里面的ssoId)
				 * 
				 * 查询一下商城的数据库里面有木有管理员.
				 */
				Map<String, Object> condMap = new HashMap<String, Object>();
				condMap.put("ssoId", ssoId);
				AAdmins adminsRes = this.usersService.findOneAdminsService(condMap);

				/*
				 * 断言
				 * 
				 * flag:true:添加 false:更新
				 */
				boolean flag = false;
				if (adminsRes == null) {
					/* 数据库中不存在 */
					adminsRes = new AAdmins();
					/* 创建时间 */
					adminsRes.setCreateTime(new Date());
					flag = true;
				}

				adminsRes.setEmail(adminsJSON.getString("email"));
				adminsRes.setTrueName(adminsJSON.getString("name"));
				/* 如何将字符串变成Date */
				adminsRes.setLastLoginTime(this.dateFormatUtil.strDateTime(adminsJSON.get("lastLoginTime") + ""));
				adminsRes.setUpdateTime(new Date());

				/*
				 * 啥时候更新, 啥时候添加
				 */
				JSONObject resultDbJSON = null;
				if (flag) {
					/* 添加 */
					resultDbJSON = this.usersService.saveOneAdminsService(adminsRes);
				} else {
					/* 更新 */
					resultDbJSON = this.usersService.updateOneAdminsService(adminsRes);
				}

				ConstatFinalUtil.SYS_LOGGER.info("结果:{}", resultDbJSON);

				/* 存储的时候要存储对象 */
				session.setAttribute("admins", adminsRes);
				return true;
			}
		}

		/*
		 * 需要登陆 获取当前访问的URL 客户端跳转到用户中心的登陆页面, 把returnUrl带上,同时要加密哟(UrlEncode)
		 */
		String returnUrl = request.getRequestURL() + "";
		String queryStr = request.getQueryString();
		/*
		 * ?后面的参数木有了, 如何获取呢?
		 */
		if (queryStr != null) {
			returnUrl += "?" + queryStr;
		}
		System.out.println("=====returnUrl==========" + returnUrl);
		/*
		 * 客户端中转到用户中心 http://xxxx:8080/userscenter-back/login.htm?returnUrl
		 */
		String url = ConstatFinalUtil.CONFIG_JSON.getString("userscenter.back.login.url");
		url += "&returnUrl=" + URLEncoder.encode(returnUrl, "UTF-8");
		System.out.println("=====url========" + url);
		response.sendRedirect(url);
		return false;
	}
}
